package com.carrey.carrey_utils;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.time.Instant;
import java.time.LocalDateTime;
import java.time.Month;
import java.time.ZoneId;
import java.util.Calendar;
import java.util.Date;

public class DateUtils {

	/**
	 * 将Date类型转换为String（日期类型固定的）
	 * 
	 * @param date
	 * @return
	 */
	public static String getStringFromDate(Date date) {
		// 简单日期格式
		SimpleDateFormat simpleFormat = new SimpleDateFormat("yyyy-MM-dd");
		return simpleFormat.format(date);
	}

	// 将Date类型转换为String（日期类型自定义）
	public static String getStringFromDate(Date date, String str) {
		// 简单日期格式
		SimpleDateFormat simpleFormat = new SimpleDateFormat(str);
		return simpleFormat.format(date);
	}

	// 将String类型转换为Date
	public static Date getDateFromString(String str) throws ParseException {
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
		return sdf.parse(str);
	}

	// 将String类型转换为Date
	public static Date getDateFromString(String str, String patter) throws ParseException {
		SimpleDateFormat sdf = new SimpleDateFormat(patter);
		return sdf.parse(str);
	}
	
	// 计算传入日期到现在共有多少月
	public static int getMonth(Date date) throws ParseException {
		// 日历类:获取当前时间的年、月
		Calendar instance = Calendar.getInstance();
		int year = instance.get(Calendar.YEAR);
		int month = instance.get(Calendar.MONTH);
		// 获取传入时间的年月
		instance.setTime(date);
		int old_year = instance.get(Calendar.YEAR);
		int old_month = instance.get(Calendar.MONTH);
		// 计算逻辑
		int result = (year - old_year) * 12 + Math.abs((month - old_month));
		return result;
	}

	// 计算传入日期到现在的年龄（根据生日计算年龄）
	public static int getAge(Date birthday) {
		// Calendar日历类实现方式
		// 1.获取系统的年月日
		Calendar c = Calendar.getInstance();// 用系统时间初始化日历类
		int now_year = c.get(Calendar.YEAR);// 获取系统的年
		int now_month = c.get(Calendar.MONTH);// 获取系统的月
		int now_day = c.get(Calendar.DAY_OF_MONTH);// 获取系统的日
		// 2获取出生日期的年月日
		c.setTime(birthday);// 修个日历类的具体时间
		int b_year = c.get(Calendar.YEAR);// 获取生日的年
		int b_month = c.get(Calendar.MONTH);// 获取生日的月
		int b_day = c.get(Calendar.DAY_OF_MONTH);// 获取生日的哪一天
		int age = now_year - b_year;// 年龄
		// 还没有到生日月份
		if (now_month < b_month) {
			// 让年龄减小1
			return age--;
		}
		if (now_month == b_month && now_day < b_day) {
			return age--;
		}
		return age;
	}

	// LocalDateTime时间类实现方式
	public static int getBirthAge(Date birthday) {
		// 1.获取系统的年月日
		LocalDateTime now = LocalDateTime.now();
		int year = now.getYear();
		Month month = now.getMonth();
		int dayOfMonth = now.getDayOfMonth();
		// 2、出生日期的年月日类型转换
		Instant instant = birthday.toInstant();
		ZoneId zoneId = ZoneId.systemDefault();
		LocalDateTime of = instant.atZone(zoneId).toLocalDateTime(); // 将date类型转换成localdatetime类型
		int year1 = of.getYear();
		Month month1 = of.getMonth();
		int dayOfMonth1 = of.getDayOfMonth();
		int age = year - year1;// 年龄

		@SuppressWarnings("unused")
		int compareTo = now.compareTo(of);
		// 还没有到生日月份
		if (month.compareTo(month1) < 0) {
			// 让年龄减小1
			return age--;
		}
		if (month.compareTo(month1) == 0 && dayOfMonth < dayOfMonth1) {
			// 让年龄减小1
			return age--;
		}
		return age;
	}

	// 获取给定时间的月初开始时间（当月的第一天凌晨）
	public static Date getFirstDayOfMonth(Date date) {
		// 日历类
		Calendar instance = Calendar.getInstance();
		instance.setTime(date);
		// 重新设置时间（日，时，分）
		instance.set(instance.get(Calendar.YEAR), instance.get(Calendar.MONTH), 1, 0, 0, 0);
		Date time = instance.getTime();
		return time;
	}

	// 获取给定时间的月末结束时间（当月的最后一天凌晨）
	public static Date getLastDayOfMonth(Date src) {
		// 思路： 让当前日期的月份加1个月，然后获取月初，再减去1秒
		// 1.获取系统日期
		Calendar c = Calendar.getInstance();
		// 2.用传入的日期初始化日历类
		c.setTime(src);
		// 3让当前日期的月份加1个月
		c.add(Calendar.MONTH, 1);
		// 4.然后获取月初
		c.set(c.get(Calendar.YEAR), c.get(Calendar.MONTH), 1, 0, 0, 0);
		// 5.再减去1秒
		c.add(Calendar.SECOND, -1);
		return c.getTime();
	}

	// 获取当前时间的指定天数的时间(正数：未来日期；负数：历史日期)
	public static Date offsetDate(int days) {
		Calendar c = Calendar.getInstance();
		c.add(Calendar.DAY_OF_MONTH, days);
		return c.getTime();
	}

	// 获取当前季节
	public static String getCurrentSeason() {
		Calendar c = Calendar.getInstance();
		// 获取当前系统时间的月份
		int month = c.get(Calendar.MONTH) + 1;
		// 春：3-4-5；夏：6-7-8；秋：9-10-11；冬： 12-1-2
		if (month > 2 && month < 9) {
			if (month < 6) {
				return Season.SPRING.getValue();
			}
			return Season.SUMMER.getValue();
		} else {
			if (month > 9 && month < 12) {
				return Season.AUTUMN.getValue();
			}
			return Season.WINTER.getValue();
		}

	}

	/**
	 * 	人性化时间
	 * @param date
	 * @return
	 */
	public static String getDisplayTime(Date date) {
		// 获取传入日期的毫米值 ;从1970-1-1 到date 的毫米值
		long t1 = date.getTime();
		// 当前系统日期的毫米值;即 从1970-1-1 到现在的毫米值
		long t2 = new Date().getTime();
		// 获取两个时间的差值
		long t = t2 - t1;
		// 分钟
		long minute = t / 1000 / 60;
		if (t2 < t1)
			return "未来时间";
		if (minute / 60 / 24 / 30 / 12 >= 1)
			return minute / 60 / 24 / 30 / 12 + "年前";
		else if (minute / 60 / 24 / 30 >= 1)
			return minute / 60 / 24 / 30 + "月前";
		else if (minute / 60 / 24 >= 1)
			return minute / 60 / 24 + "天前";
		else if (minute / 60 >= 1)
			return minute / 60 + "小时前";
		else if (minute > 5)//
			return minute + "分钟前";
		else
			return "刚刚";
	}

}
